package com.tfswx.jkgl.designer.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson.JSON;
import com.tfswx.jkgl.designer.dao.*;
import com.tfswx.jkgl.designer.datasource.InitDatabase;
import com.tfswx.jkgl.designer.dto.jkgl.*;
import com.tfswx.jkgl.designer.dto.mxgl.*;
import com.tfswx.jkgl.designer.dto.stgl.*;
import com.tfswx.jkgl.designer.dto.xmgl.*;
import com.tfswx.jkgl.designer.model.*;
import com.tfswx.jkgl.designer.service.*;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @author ricky
 * @date 2021/12/10
 */
@Service
public class XmglServiceImpl implements XmglService {
    @Resource
    private XmglXtXmxxMapper xmxxMapper;
    @Resource
    private XmglXtMkxxMapper mkxxMapper;
    @Resource
    private StglService stglService;
    @Resource
    private MxglService mxglService;
    @Resource
    private JkglService jkglService;

    @Override
    public String addXmxx(XmxxAddInputDTO inputDTO) {
        XmglXtXmxx xmglXtXmxx = BeanUtil.copyProperties(inputDTO, XmglXtXmxx.class);
        xmglXtXmxx.setXmbm(IdUtil.fastSimpleUUID().toUpperCase());
        xmglXtXmxx.setSfsc("N");
        xmglXtXmxx.setCjsj(new Date());
        xmglXtXmxx.setZhxgsj(new Date());
        int i = xmxxMapper.insert(xmglXtXmxx);
        if (i != 1) {
            throw new RuntimeException("添加项目信息失败");
        }
        InitDatabase.regist();
        return xmglXtXmxx.getXmbm();
    }

    @Override
    public boolean deleteXmxx(XmxxDeleteInputDTO inputDTO) {
        XmglXtXmxx xmglXtXmxx = BeanUtil.copyProperties(inputDTO, XmglXtXmxx.class);
        xmglXtXmxx.setZhxgsj(new Date());
        int i = xmxxMapper.delete(xmglXtXmxx);
        if (i != 1) {
            throw new RuntimeException("删除项目信息失败");
        }
        InitDatabase.regist();
        return false;
    }

    @Override
    public boolean updateXmxx(XmxxUpdateInputDTO inputDTO) {
        XmglXtXmxx xmglXtXmxx = BeanUtil.copyProperties(inputDTO, XmglXtXmxx.class);
        xmglXtXmxx.setZhxgsj(new Date());
        int i = xmxxMapper.update(xmglXtXmxx);
        if (i != 1) {
            throw new RuntimeException("修改项目信息失败");
        }
        InitDatabase.regist();
        return true;
    }

    @Override
    public List<XmxxQueryOutputDTO> queryXmxx(XmxxQueryInputDTO inputDTO) {
        XmglXtXmxx xmglXtXmxx = BeanUtil.copyProperties(inputDTO, XmglXtXmxx.class);
        return xmxxMapper.queryXmxx(xmglXtXmxx);
    }

    @Override
    public String addMkxx(MkxxAddInputDTO inputDTO) {
        XmglXtMkxx xmglXtMkxx = BeanUtil.copyProperties(inputDTO, XmglXtMkxx.class);
        xmglXtMkxx.setMkbm(IdUtil.fastSimpleUUID().toUpperCase());
        xmglXtMkxx.setSfsc("N");
        xmglXtMkxx.setCjsj(new Date());
        xmglXtMkxx.setZhxgsj(new Date());
        int i = mkxxMapper.insert(xmglXtMkxx);
        if (i != 1) {
            throw new RuntimeException("添加模块信息失败");
        }
        return xmglXtMkxx.getMkbm();
    }

    @Override
    public XmxxGetOutputDTO getXmxx(XmxxGetInputDTO xmxxGetInputDTO) {
        XmglXtXmxx xmglXtXmxx = BeanUtil.copyProperties(xmxxGetInputDTO, XmglXtXmxx.class);
        xmglXtXmxx = xmxxMapper.get(xmglXtXmxx);
        if (xmglXtXmxx == null) {
            return null;
        }
        return BeanUtil.copyProperties(xmglXtXmxx, XmxxGetOutputDTO.class);
    }

    @Override
    public List<ZmkhstlbQueryResult> queryZmkhstlb(ZmkhstlbQueryInputDTO inputDTO) {
        XmglXtMkxx xmglXtMkxx = BeanUtil.copyProperties(inputDTO, XmglXtMkxx.class);
        return mkxxMapper.queryZmkhstlb(xmglXtMkxx);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean copyXm(XmCopyInputDTO inputDTO) {
        // 复制项目信息
        XmxxGetInputDTO xmxxGetInputDTO = new XmxxGetInputDTO();
        xmxxGetInputDTO.setXmbm(inputDTO.getXmbm());
        XmxxGetOutputDTO xmxx = getXmxx(xmxxGetInputDTO);
        if (xmxx == null) {
            throw new RuntimeException("源项目不存在，请检查！");
        }
        XmxxAddInputDTO xmxxAddInputDTO = BeanUtil.copyProperties(xmxx, XmxxAddInputDTO.class);
        xmxxAddInputDTO.setXmmc(xmxx.getXmmc() + "-副本");
        String xmbm = addXmxx(xmxxAddInputDTO);

        // 复制模块信息
        MkxxQueryInputDTO mkxxQueryInputDTO = new MkxxQueryInputDTO();
        mkxxQueryInputDTO.setXmbm(inputDTO.getXmbm());
        List<MkxxQueryResult> mkxxQueryResults = queryMkxx(mkxxQueryInputDTO);
        // 一级模块列表
        List<MkxxQueryResult> yjmkList = mkxxQueryResults.stream().filter(item -> StringUtils.isBlank(item.getFmkbm())).collect(Collectors.toList());
        copyMkList(yjmkList, xmbm, mkxxQueryResults, null, inputDTO.getSfnbjk());
        return true;
    }

    private void copyMkList(List<MkxxQueryResult> mkList, String xmbm, List<MkxxQueryResult> allMk, String fmkbm, String sfnbjk) {
        MkxxAddInputDTO mk;
        for (MkxxQueryResult yjmk : mkList) {
            mk = BeanUtil.copyProperties(yjmk, MkxxAddInputDTO.class);
            mk.setXmbm(xmbm);
            mk.setFmkbm(fmkbm);
            String mkbm = addMkxx(mk);

            // 复制实体
            StdyQueryInputDTO stdyQueryInputDTO = new StdyQueryInputDTO();
            stdyQueryInputDTO.setStflbm(yjmk.getMkbm());
            List<StdyQueryOutputDTO> stdyList = stglService.queryStdy(stdyQueryInputDTO);

            StdyAddInputDTO stdy;
            for (StdyQueryOutputDTO stdyQueryOutputDTO : stdyList) {
                stdy = BeanUtil.copyProperties(stdyQueryOutputDTO, StdyAddInputDTO.class);
                stdy.setStflbm(mkbm);
                String stbm = stglService.addStdy(stdy);

                // 复制字段
                ZddyQueryInputDTO zddyQueryInputDTO = new ZddyQueryInputDTO();
                zddyQueryInputDTO.setStbm(stdyQueryOutputDTO.getStbm());
                List<ZddyQueryOutputDTO> zddyQueryOutputDTOS = stglService.queryZddy(zddyQueryInputDTO);
                ZddyAddInputDTO zddy;
                for (ZddyQueryOutputDTO zddyQueryOutputDTO : zddyQueryOutputDTOS) {
                    zddy = BeanUtil.copyProperties(zddyQueryOutputDTO, ZddyAddInputDTO.class);
                    zddy.setStbm(stbm);
                    stglService.addZddy(zddy);
                }
            }

            // 复制模型
            MxdyQueryInputDTO mxdyQueryInputDTO = new MxdyQueryInputDTO();
            mxdyQueryInputDTO.setMxflbm(yjmk.getMkbm());
            List<MxdyQueryOutputDTO> mxdyQueryOutputDTOS = mxglService.queryMxdy(mxdyQueryInputDTO);
            MxdyAddInputDTO mxdy;
            for (MxdyQueryOutputDTO mxdyQueryOutputDTO : mxdyQueryOutputDTOS) {
                mxdy = BeanUtil.copyProperties(mxdyQueryOutputDTO, MxdyAddInputDTO.class);
                mxdy.setMxflbm(mkbm);
                String mxbm = mxglService.addMxdy(mxdy);
                // 复制模型实体关系
                MxstgxQueryInputDTO mxstgxQueryInputDTO = new MxstgxQueryInputDTO();
                mxstgxQueryInputDTO.setMxbm(mxdyQueryOutputDTO.getMxbm());
                List<MxstgxQueryOutputDTO> mxstgxQueryOutputDTOS = mxglService.queryMxstgx(mxstgxQueryInputDTO);
                MxstgxAddInputDTO mxstgx;
                for (MxstgxQueryOutputDTO mxstgxQueryOutputDTO : mxstgxQueryOutputDTOS) {
                    mxstgx = BeanUtil.copyProperties(mxstgxQueryOutputDTO, MxstgxAddInputDTO.class);
                    mxstgx.setMxbm(mxbm);
                    mxglService.addMxstgx(mxstgx);
                }

            }
            // 复制接口
            JkdyQueryInputDTO jkdyQueryInputDTO = new JkdyQueryInputDTO();
            jkdyQueryInputDTO.setJkflbm(yjmk.getMkbm());
            jkdyQueryInputDTO.setSfnbjk(sfnbjk);
            List<JkdyQueryResult> jkdyQueryResults = jkglService.queryJkdy(jkdyQueryInputDTO);
            JkdyAddInputDTO jkdy;
            for (JkdyQueryResult jkdyQueryResult : jkdyQueryResults) {
                jkdy = BeanUtil.copyProperties(jkdyQueryResult, JkdyAddInputDTO.class);
                jkdy.setJkflbm(mkbm);
                jkglService.addJkdy(jkdy);
            }

            List<MkxxQueryResult> chidMkList = allMk.stream().filter(item -> item.getFmkbm().equals(yjmk.getMkbm())).collect(Collectors.toList());
            if (!chidMkList.isEmpty()) {
                copyMkList(chidMkList, xmbm, allMk, mkbm, sfnbjk);
            }
        }
    }

    @Override
    public boolean deleteMkxx(MkxxDeleteInputDTO inputDTO) {
        XmglXtMkxx xmglXtMkxx = BeanUtil.copyProperties(inputDTO, XmglXtMkxx.class);
        xmglXtMkxx.setZhxgsj(new Date());
        int i = mkxxMapper.delete(xmglXtMkxx);
        if (i != 1) {
            throw new RuntimeException("删除模块信息失败");
        }
        return false;
    }

    @Override
    public boolean updateMkxx(MkxxUpdateInputDTO inputDTO) {
        XmglXtMkxx xmglXtMkxx = BeanUtil.copyProperties(inputDTO, XmglXtMkxx.class);
        xmglXtMkxx.setZhxgsj(new Date());
        int i = mkxxMapper.update(xmglXtMkxx);
        if (i != 1) {
            throw new RuntimeException("修改模块信息失败");
        }
        return true;
    }

    @Override
    public List<MkxxQueryResult> queryMkxx(MkxxQueryInputDTO inputDTO) {
        XmglXtMkxx xmglXtMkxx = BeanUtil.copyProperties(inputDTO, XmglXtMkxx.class);
        return mkxxMapper.queryMkxx(xmglXtMkxx);
    }
}
